﻿using BCCommon;
using BCData.MakeStaticPagingComponent.TemplateTag;
using BCDto.MakeStaticPagingComponent.TemplateTag;
using BCEntity.MakeStaticPagingComponent.TemplateTag;
using BCService.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BCService.MakeStaticPagingComponent.TemplateTagService
{
    /// <summary>
    /// 模板标签相关服务
    /// </summary>
    /// <returns></returns>
    public class TemplateTagService : ITemplateTagService
    {
        private readonly ITemplateTagData templateTagData;

        public TemplateTagService(ITemplateTagData templateTagData)
        {
            this.templateTagData = templateTagData;
        }

        public TemplateTagDto Add(TemplateTagRequestDto templateTagRequestDto)
        {
            if (this.templateTagData.CheckTemplateTagExists(templateTagRequestDto.TagName))
            {
                throw new ArgumentException("此模板标签已存在。");
            }
            return this.templateTagData.Add(templateTagRequestDto.As<TemplateTagEntity>()).As<TemplateTagDto>();
        }

        public void Delete(long templateTagId)
        {
            this.templateTagData.Delete(templateTagId);
        }

        public TemplateTagDto Get(string tagName)
        {
            return this.templateTagData.GetTemplateTagEntity(tagName).As<TemplateTagDto>();
        }

        public TemplateTagDto Get(long templateTagId)
        {
            return this.templateTagData.GetTemplateTagEntity(templateTagId).As<TemplateTagDto>();
        }

        public IEnumerable<TemplateTagDto> Get()
        {
            return this.templateTagData.Get().As<IEnumerable<TemplateTagDto>>();
        }

        public IEnumerable<string> GetTemplateTagName()
        {
            return this.templateTagData.GetTemplateTagName();
        }

        public IEnumerable<object> GetTagNameAndTagDescription()
        {
            IEnumerable<TemplateTagEntity> templateTagEntities = this.templateTagData.Get();
            return templateTagEntities.Select(p => new { name = p.TagName, value = p.TagDescription });
        }

        public TemplateTagDto Update(long templateTagId, TemplateTagRequestDto templateTagRequestDto)
        {
            TemplateTagEntity entity = this.templateTagData.GetTemplateTagEntity(templateTagId);
            if (entity == null)
            {
                throw new ArgumentException("此模板标记不正确。");
            }
            if (!entity.TagName.Equals(templateTagRequestDto.TagName))
            {
                if (this.templateTagData.CheckTemplateTagExists(templateTagRequestDto.TagName))
                {
                    throw new ArgumentException("此模板标签已存在。");
                }
            }

            TemplateTagEntity templateTagEntity = templateTagRequestDto.As<TemplateTagEntity>();
            templateTagEntity.TemplateTagId = templateTagId;
            return this.templateTagData.Update(templateTagEntity).As<TemplateTagDto>();
        }
        
        public PageableList<TemplateTagDto> Query(string tagName, string tagDescription, DateTime? start, DateTime? end, string sortField, bool? ascending, int index, int size)
        {
            var list = this.templateTagData.Query(tagName, tagDescription, start, end, sortField, ascending, out int dataCount, index, size);

            return new PageableList<TemplateTagDto>
            {
                Count = dataCount,
                Items = list.As<IEnumerable<TemplateTagDto>>()
            };
        }
    }
}
